// 这个模块是对axios封装的模块
import axios from 'axios'
import { Loading } from 'element-ui'
import router from '@/router'
import store from '@/store'
/* axios.defaults.baseURL = 'http://www.liulongbin.top:3008'
export default axios
 */
// axios.create()方法 可以创建一个axios实例
const instance = axios.create({
  baseURL: 'http://www.liulongbin.top:3008'
})

// 拦截器中的两个函数 是正确的请求||响应会经过函数1 , 错误的请求和响应会经过函数2
let loading = null
// 添加请求拦截器
instance.interceptors.request.use(function (config) {
  // 在发送请求之前做些什么
  // config是请求相关的配置对象, 这个对象中有一个headers 就是请求头对象
  // console.log(config)
  // startsWith 检测一个字符串是否以某个字符开头 'abc'.startsWith('x')
  // 只给以 /my开头的接口挂载 token
  if (config.url.startsWith('/my')) {
    config.headers.Authorization = localStorage.getItem('bigevent-token')
  }

  loading = Loading.service({
    lock: true, // 加载期间禁止滚动
    text: '努力加载中', // 加载的提示文本
    spinner: 'el-icon-loading', // 加载的小图标
    background: 'rgba(0, 0, 0, 0.7)' // 加载的遮罩颜色
  })
  return config
}, function (error) {
  // 对请求错误做些什么
  return Promise.reject(error)
})

// 添加响应拦截器
// 每一次正确的响应会经过函数1, 每一次失败的响应会经过函数2
instance.interceptors.response.use(function (response) {
  // 对响应数据做点什么
  // console.log(response) // axios处理过后的响应的数据
  loading.close() // 关闭loading
  return response
}, function (error) {
  // error是 响应失败的错误对象 error中有一个response就是响应的结果
  // console.dir(error)
  if (error.response.status === 401 && error.response.data.code === 1) {
    // console.log('token过期请重新登录')
    // js文件中 this不指向组件实例, 需要单独导入router
    // 清除个人信息
    store.commit('user/setUserInfo', {})
    // 清除token
    localStorage.removeItem('bigevent-token')
    // 重新登录  /login
    router.push('/login')
  }
  // 对响应错误做点什么
  loading.close() // 关闭loading
  return Promise.reject(error)
})

export default instance
